"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/10/27 10:04
@Description :  函数使用细节
1.函数的参数可以有多个，也可以没有
2.函数的命名要符合标识符的命名规则
3.函数内部定义的变量是局部变量，函数外不能访问
4.同一个文件中定义了两个相同名字的函数，调用时遵循就近原则，有参数区分时也是就近原则
5.函数调用时根据参数的位置进行参数传递，称为位置参数，传递的实参和定义的形参顺序和个数均要保持一致，
同时定义的形参不用指定数据类型，会根据传入的实参决定
6. 函数允许有返回值切可以返回多个值，返回值不受限制
7. 关键字参数，参数传递时可以不用再考虑参数的位置，直接根据名字实现参数的传递
8. 函数支持默认参数和缺省参数
9.  不定参数
10  函数的可变参数/不定长参数，还支持关键字参数，也就是多个 形参名=实参值
"""


#  函数中定义变量
def fn1():
    str_info = "hello def"  # 局部变量  只能在函数内使用
    print(str_info)


#  函数外访问函数内的变量   name 'str_info' is not defined
# print(f'var in def  str_info = {str_info}')

#  调用函数  访问函数内部的变量
fn1()

print('--------------------------------------------')
int_num = 10  # 全局变量


def fn2():
    print(f'int_num = {int_num}')


# 调用函数
fn2()


def fn2(info):
    print(f"{info}")


# fn2
fn2("hello fn2")

print('------------------------------------------')


# 三个参数函数  形参不需要指定类型  会根据传的实际参数决定
def fn3(info, num1, bol):
    print(f"info = {info}")
    print(f"num1 = {num1}")
    print(f"bol = {bol}")


fn3('hello', 10, True)
# fn3('hello',True)   # fn3() missing 1 required positional argument: 'bol'

print('------------------------------------------')


def add(num1, num2):
    result = num1 + num2
    return result  # 返回计算结果


#  访问函数内部计算的结果  result
add_result = add(10, 20)
print(add_result + 10)

print('------------------------------------------')


#  函数的返回值是多个数据    元组
def new_fn(num1, num2):
    result1 = num1 + num2
    result2 = num1 - num2
    result3 = num1 * num2
    result4 = num1 / num2
    return result1, result2, result3, result4


new_result = new_fn(10, 20)
print(new_result, type(new_result))
#  拆包
var1, var2, var3, var4 = new_fn(1, 2)
print(var1, var2, var3, var4)

print('------------------------------------------')


def print_student_info(name, age, sex, score):
    print(f'name = {name},age={age},sex={sex},score={score}')


#  位置参数
print_student_info('lisi', 'male', 21, 90)

# 关键词参数
print_student_info(name='lisi', sex='male', age=21, score=90)

print('------------------------------------------')


# 函数支持默认参数和缺省参数
def default_params(a, b, c=10):
    print(a, b, c)


default_params(1, 2, 5)
#  缺省参数
default_params(1, 2)


# 不定参  tuple
def add_num(*args):
    sum = 0
    for num in args:
        sum += num
    return sum
print(add_num(1,2,3,4))

# 函数的可变参数/不定长参数，还支持关键字参数，也就是多个 形参名=实参值   dict
def add_num2(**args):
    print(args,type(args))

add_num2(num1=1, num2=2, num3=3, num4=4)
